perm filename EADD7.2[EAL,HE]1 blob sn#674842 filedate 1982-09-27 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	{$NOMAIN	Editor: aux routines for addStmnt }
C00005 00003	procedure addDeclSt(nextLinep: cursorpp var sp: statementp
C00008 00004	procedure add3Aux (nextLinep: cursorpp sp: statementp slabel: varidefp
C00011 ENDMK
C⊗;
{$NOMAIN	Editor: aux routines for addStmnt }

%include eedit.hdr;

{ Externally defined routines from elsewhere: }

	(* From ALLOC *)
procedure relStatement(n: statementp);				external;
procedure relVaridef(n: varidefp);				external;

	(* From EAUX1A *)
function eMakeVar(vartype: datatypes; vid: identp): varidefp;	external;

	(* From EAUX2A *)
procedure eMakeNewVar(newvar: varidefp);			external;

	(* From EPAR3A *)
procedure eAssignParse(st: statementp);				external;

	(* From EPAR3C *)
function declarationp: boolean;					external;
function getEDeclarations(pdef: boolean; lev: integer;
	var vo: varidefp; var numvars: integer): varidefp;	external;

	(* From EPAR3D *)
procedure reParse(st: statementp);				external;

	(* From EAUX3C - addStmnt aux routines *)
procedure addNEnv;						external;
procedure addNSt(sty: stmntypes; nextLinep: cursorpp; 
	var sp: statementp; slabel: varidefp; 
	emptyp,stok: boolean; var nogood: boolean);		external;

	(* From PP *)
procedure relLine(l: linerecp);					external;
procedure ppLine; 						external;
procedure ppOutNow; 						external;
procedure ppChar(ch: ascii); 					external;
procedure pp5(ch: c5str; length: integer); 			external;
procedure pp10(ch: cstring; length: integer); 			external;
procedure pp10L(ch: cstring; length: integer);			external;
procedure pp20(ch: c20str; length: integer); 			external;
procedure pp20L(ch: c20str; length: integer); 			external;

procedure addDeclSt(nextLinep: cursorpp; var sp: statementp;
       slabel: varidefp; emptyp,stok: boolean; var nogood: boolean); external;
procedure addDeclSt;
 var b: boolean; v,vp,vo: varidefp; i: integer;
 begin
 with cursorStack[cursor-1] do
  b := stmntp and (st↑.stype = blocktype) and stOk;	(* check in a block *)
 if b then
   begin			(* add a new declaration statement *)
   addNSt(declaretype,nextLinep,sp,slabel,emptyp,stok,nogood);
   addNEnv;
   v := nil;
   v := getEDeclarations(false,curBlock↑.level,v,i);
   sp↑.numvars := i;			(* remember # of variables *)
   if v = nil then
     begin nogood := true; relStatement(sp); end;
   vo := nil;
   while v <> nil do
    begin
    vp := eMakeVar(v↑.vtype,v↑.name);
    if vo = nil then sp↑.variables := vp else vo↑.dnext := vp;
    vo := vp;
    with vp↑ do
     begin				(* copy relevant fields *)
     dtype := v↑.dtype;
     tbits := v↑.tbits;
     if odd(tbits) then a := v↑.a	(* copy array bounds *)
      else if tbits = 2 then
       begin		(* need to do special stuff for procedure??? *)
       p := v↑.p;				(* copy proc def *)
       p↑.pname := vp;
       cursorLine := cursorLine + 1;
       end;
     end;
    eMakeNewVar(vp);		(* if active block make env entry for var *)
    vp := v↑.dnext;
    relVaridef(v);		(* all done with the duplicate varidef now *)
    v := vp;
    end;
   reParse(curBlock);
   end
  else
   begin
   pp20L(' Can''t have a declar',20); pp10('ation here',10); ppLine;
   nogood := true;
   end
 end;

procedure add3Aux (nextLinep: cursorpp; sp: statementp; slabel: varidefp;
	var emptyp,stok,nogood,labp: boolean; var lcur: integer); external;
procedure add3Aux;
 begin
 with eCurToken do
  if ttype = comnttype then
   begin			(* comment *)
(* *** need to check if it should be a statement or clause comment *** *)
   addNSt(commenttype,nextLinep,sp,slabel,emptyp,stok,nogood);	
   if stOk then
     begin
     sp↑.str := str;		(* copy string pointer *)
     sp↑.len := len;
     sp↑.cbody := nil;
     end
   end
  else if endOfLine then
   begin
   if slabel = nil then nogood := not labp;	(* delete the line if empty *)
   end
  else	(* probably an assignment statement or declaration *)
   begin
   eBackup := true;
   if declarationp then
     begin
     addDeclSt(nextLinep,sp,slabel,emptyp,stok,nogood);
     lcur := 0;		(* reParse will update display *)
     end
    else if (ttype = identtype) or
	    ((ttype = reswdtype) and (rtype = optype)) then
     begin
     addNSt(assigntype,nextLinep,sp,slabel,emptyp,stok,nogood);
     if stOk then eAssignParse(sp);
     end
    else
     begin			(* no good - complain *)
     pp20L(' Can''t make sense of',20); pp20(' inserted text      ',14); ppLine;
     nogood := true;
     eBackup := false;	(* ??? *)
     end;
   end;
 end;